{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\ProgramData\\Anaconda3\\lib\\importlib\\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n",
      "  return f(*args, **kwds)\n",
      "d:\\ProgramData\\Anaconda3\\lib\\importlib\\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n",
      "  return f(*args, **kwds)\n",
      "d:\\ProgramData\\Anaconda3\\lib\\importlib\\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n",
      "  return f(*args, **kwds)\n",
      "d:\\ProgramData\\Anaconda3\\lib\\importlib\\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n",
      "  return f(*args, **kwds)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.metrics import r2_score   #评价回归预测模型的的性能\n",
    "import matplotlib.pyplot as plt    #画图\n",
    "import seaborn as sns\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>dteday</th>\n",
       "      <th>season</th>\n",
       "      <th>yr</th>\n",
       "      <th>mnth</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weathersit</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2011-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.344167</td>\n",
       "      <td>0.363625</td>\n",
       "      <td>0.805833</td>\n",
       "      <td>0.160446</td>\n",
       "      <td>331</td>\n",
       "      <td>654</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2011-01-02</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.363478</td>\n",
       "      <td>0.353739</td>\n",
       "      <td>0.696087</td>\n",
       "      <td>0.248539</td>\n",
       "      <td>131</td>\n",
       "      <td>670</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>2011-01-03</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.196364</td>\n",
       "      <td>0.189405</td>\n",
       "      <td>0.437273</td>\n",
       "      <td>0.248309</td>\n",
       "      <td>120</td>\n",
       "      <td>1229</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>2011-01-04</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>0.212122</td>\n",
       "      <td>0.590435</td>\n",
       "      <td>0.160296</td>\n",
       "      <td>108</td>\n",
       "      <td>1454</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>2011-01-05</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.226957</td>\n",
       "      <td>0.229270</td>\n",
       "      <td>0.436957</td>\n",
       "      <td>0.186900</td>\n",
       "      <td>82</td>\n",
       "      <td>1518</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>2011-01-06</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.204348</td>\n",
       "      <td>0.233209</td>\n",
       "      <td>0.518261</td>\n",
       "      <td>0.089565</td>\n",
       "      <td>88</td>\n",
       "      <td>1518</td>\n",
       "      <td>1606</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>2011-01-07</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.196522</td>\n",
       "      <td>0.208839</td>\n",
       "      <td>0.498696</td>\n",
       "      <td>0.168726</td>\n",
       "      <td>148</td>\n",
       "      <td>1362</td>\n",
       "      <td>1510</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>2011-01-08</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.165000</td>\n",
       "      <td>0.162254</td>\n",
       "      <td>0.535833</td>\n",
       "      <td>0.266804</td>\n",
       "      <td>68</td>\n",
       "      <td>891</td>\n",
       "      <td>959</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9</td>\n",
       "      <td>2011-01-09</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.138333</td>\n",
       "      <td>0.116175</td>\n",
       "      <td>0.434167</td>\n",
       "      <td>0.361950</td>\n",
       "      <td>54</td>\n",
       "      <td>768</td>\n",
       "      <td>822</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>2011-01-10</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.150833</td>\n",
       "      <td>0.150888</td>\n",
       "      <td>0.482917</td>\n",
       "      <td>0.223267</td>\n",
       "      <td>41</td>\n",
       "      <td>1280</td>\n",
       "      <td>1321</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant      dteday  season  yr  mnth  holiday  weekday  workingday  \\\n",
       "0        1  2011-01-01       1   0     1        0        6           0   \n",
       "1        2  2011-01-02       1   0     1        0        0           0   \n",
       "2        3  2011-01-03       1   0     1        0        1           1   \n",
       "3        4  2011-01-04       1   0     1        0        2           1   \n",
       "4        5  2011-01-05       1   0     1        0        3           1   \n",
       "5        6  2011-01-06       1   0     1        0        4           1   \n",
       "6        7  2011-01-07       1   0     1        0        5           1   \n",
       "7        8  2011-01-08       1   0     1        0        6           0   \n",
       "8        9  2011-01-09       1   0     1        0        0           0   \n",
       "9       10  2011-01-10       1   0     1        0        1           1   \n",
       "\n",
       "   weathersit      temp     atemp       hum  windspeed  casual  registered  \\\n",
       "0           2  0.344167  0.363625  0.805833   0.160446     331         654   \n",
       "1           2  0.363478  0.353739  0.696087   0.248539     131         670   \n",
       "2           1  0.196364  0.189405  0.437273   0.248309     120        1229   \n",
       "3           1  0.200000  0.212122  0.590435   0.160296     108        1454   \n",
       "4           1  0.226957  0.229270  0.436957   0.186900      82        1518   \n",
       "5           1  0.204348  0.233209  0.518261   0.089565      88        1518   \n",
       "6           2  0.196522  0.208839  0.498696   0.168726     148        1362   \n",
       "7           2  0.165000  0.162254  0.535833   0.266804      68         891   \n",
       "8           1  0.138333  0.116175  0.434167   0.361950      54         768   \n",
       "9           1  0.150833  0.150888  0.482917   0.223267      41        1280   \n",
       "\n",
       "    cnt  \n",
       "0   985  \n",
       "1   801  \n",
       "2  1349  \n",
       "3  1562  \n",
       "4  1600  \n",
       "5  1606  \n",
       "6  1510  \n",
       "7   959  \n",
       "8   822  \n",
       "9  1321  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#读取数据\n",
    "#path to where the data lies\n",
    "dpath = 'D:/0CSDN/机器学习-人工智能直通车/homework/4th week 线性回归/'\n",
    "data = pd.read_csv(dpath + \"day.csv\")\n",
    "data.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据观察"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(731, 16)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 731 entries, 0 to 730\n",
      "Data columns (total 16 columns):\n",
      "instant       731 non-null int64\n",
      "dteday        731 non-null object\n",
      "season        731 non-null int64\n",
      "yr            731 non-null int64\n",
      "mnth          731 non-null int64\n",
      "holiday       731 non-null int64\n",
      "weekday       731 non-null int64\n",
      "workingday    731 non-null int64\n",
      "weathersit    731 non-null int64\n",
      "temp          731 non-null float64\n",
      "atemp         731 non-null float64\n",
      "hum           731 non-null float64\n",
      "windspeed     731 non-null float64\n",
      "casual        731 non-null int64\n",
      "registered    731 non-null int64\n",
      "cnt           731 non-null int64\n",
      "dtypes: float64(4), int64(11), object(1)\n",
      "memory usage: 91.5+ KB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "instant       0\n",
       "dteday        0\n",
       "season        0\n",
       "yr            0\n",
       "mnth          0\n",
       "holiday       0\n",
       "weekday       0\n",
       "workingday    0\n",
       "weathersit    0\n",
       "temp          0\n",
       "atemp         0\n",
       "hum           0\n",
       "windspeed     0\n",
       "casual        0\n",
       "registered    0\n",
       "cnt           0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>season</th>\n",
       "      <th>yr</th>\n",
       "      <th>mnth</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weathersit</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>366.000000</td>\n",
       "      <td>2.496580</td>\n",
       "      <td>0.500684</td>\n",
       "      <td>6.519836</td>\n",
       "      <td>0.028728</td>\n",
       "      <td>2.997264</td>\n",
       "      <td>0.683995</td>\n",
       "      <td>1.395349</td>\n",
       "      <td>0.495385</td>\n",
       "      <td>0.474354</td>\n",
       "      <td>0.627894</td>\n",
       "      <td>0.190486</td>\n",
       "      <td>848.176471</td>\n",
       "      <td>3656.172367</td>\n",
       "      <td>4504.348837</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>211.165812</td>\n",
       "      <td>1.110807</td>\n",
       "      <td>0.500342</td>\n",
       "      <td>3.451913</td>\n",
       "      <td>0.167155</td>\n",
       "      <td>2.004787</td>\n",
       "      <td>0.465233</td>\n",
       "      <td>0.544894</td>\n",
       "      <td>0.183051</td>\n",
       "      <td>0.162961</td>\n",
       "      <td>0.142429</td>\n",
       "      <td>0.077498</td>\n",
       "      <td>686.622488</td>\n",
       "      <td>1560.256377</td>\n",
       "      <td>1937.211452</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.059130</td>\n",
       "      <td>0.079070</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.022392</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>20.000000</td>\n",
       "      <td>22.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>183.500000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.337083</td>\n",
       "      <td>0.337842</td>\n",
       "      <td>0.520000</td>\n",
       "      <td>0.134950</td>\n",
       "      <td>315.500000</td>\n",
       "      <td>2497.000000</td>\n",
       "      <td>3152.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>366.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.498333</td>\n",
       "      <td>0.486733</td>\n",
       "      <td>0.626667</td>\n",
       "      <td>0.180975</td>\n",
       "      <td>713.000000</td>\n",
       "      <td>3662.000000</td>\n",
       "      <td>4548.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>548.500000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>10.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.655417</td>\n",
       "      <td>0.608602</td>\n",
       "      <td>0.730209</td>\n",
       "      <td>0.233214</td>\n",
       "      <td>1096.000000</td>\n",
       "      <td>4776.500000</td>\n",
       "      <td>5956.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>731.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>0.861667</td>\n",
       "      <td>0.840896</td>\n",
       "      <td>0.972500</td>\n",
       "      <td>0.507463</td>\n",
       "      <td>3410.000000</td>\n",
       "      <td>6946.000000</td>\n",
       "      <td>8714.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          instant      season          yr        mnth     holiday     weekday  \\\n",
       "count  731.000000  731.000000  731.000000  731.000000  731.000000  731.000000   \n",
       "mean   366.000000    2.496580    0.500684    6.519836    0.028728    2.997264   \n",
       "std    211.165812    1.110807    0.500342    3.451913    0.167155    2.004787   \n",
       "min      1.000000    1.000000    0.000000    1.000000    0.000000    0.000000   \n",
       "25%    183.500000    2.000000    0.000000    4.000000    0.000000    1.000000   \n",
       "50%    366.000000    3.000000    1.000000    7.000000    0.000000    3.000000   \n",
       "75%    548.500000    3.000000    1.000000   10.000000    0.000000    5.000000   \n",
       "max    731.000000    4.000000    1.000000   12.000000    1.000000    6.000000   \n",
       "\n",
       "       workingday  weathersit        temp       atemp         hum   windspeed  \\\n",
       "count  731.000000  731.000000  731.000000  731.000000  731.000000  731.000000   \n",
       "mean     0.683995    1.395349    0.495385    0.474354    0.627894    0.190486   \n",
       "std      0.465233    0.544894    0.183051    0.162961    0.142429    0.077498   \n",
       "min      0.000000    1.000000    0.059130    0.079070    0.000000    0.022392   \n",
       "25%      0.000000    1.000000    0.337083    0.337842    0.520000    0.134950   \n",
       "50%      1.000000    1.000000    0.498333    0.486733    0.626667    0.180975   \n",
       "75%      1.000000    2.000000    0.655417    0.608602    0.730209    0.233214   \n",
       "max      1.000000    3.000000    0.861667    0.840896    0.972500    0.507463   \n",
       "\n",
       "            casual   registered          cnt  \n",
       "count   731.000000   731.000000   731.000000  \n",
       "mean    848.176471  3656.172367  4504.348837  \n",
       "std     686.622488  1560.256377  1937.211452  \n",
       "min       2.000000    20.000000    22.000000  \n",
       "25%     315.500000  2497.000000  3152.000000  \n",
       "50%     713.000000  3662.000000  4548.000000  \n",
       "75%    1096.000000  4776.500000  5956.000000  \n",
       "max    3410.000000  6946.000000  8714.000000  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#单变量分析分布\n",
    "#目标y(给定日期总租车人数）的直方图/分布\n",
    "fig = plt.figure()\n",
    "sns.distplot(data.cnt.values,bins = 30,kde = True)\n",
    "plt.xlabel('Values of bicycle cnt',fontsize = 20)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "日常分布特征散点图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Values of Cnt')"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(range(data.shape[0]),data['cnt'].values, color = 'blue')\n",
    "plt.title('Values of Cnt')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注册次数主要集中在4000次左右，与正态分布图情况一致，2000次和7000次左右也比较多"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据分离"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "#从原始数据中分离输入特征x和输出y\n",
    "y = data['cnt'].values\n",
    "X = data.drop('cnt', axis = 1)\n",
    "\n",
    "#尝试对y（骑行量）做log变换，对log变换后的值进行估计\n",
    "log_y = np.log1p(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据清理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = X.drop(\"dteday\",axis = 1)\n",
    "#X = X.drop(\"hum\",axis = 1)\n",
    "X = X.drop(\"season\",axis = 1)\n",
    "X = X.drop(\"yr\",axis = 1)\n",
    "X = X.drop(\"mnth\",axis = 1)\n",
    "X = X.drop(\"holiday\",axis = 1)\n",
    "#X = X.drop(\"weekday\",axis = 1)\n",
    "#X = X.drop(\"workingday\",axis = 1)\n",
    "X = X.drop(\"weathersit\",axis = 1)\n",
    "X = X.drop(\"casual\",axis = 1)\n",
    "X = X.drop(\"registered\",axis = 1)\n",
    "#用于后续显示权重系数对应的特征\n",
    "columns = X.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "丢弃类别型数值；casual、registered与cnt关联性较大，为避免对结果预测造成干扰，也进行丢弃。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>weekday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "      <td>731.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>366.000000</td>\n",
       "      <td>2.997264</td>\n",
       "      <td>0.683995</td>\n",
       "      <td>0.495385</td>\n",
       "      <td>0.474354</td>\n",
       "      <td>0.627894</td>\n",
       "      <td>0.190486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>211.165812</td>\n",
       "      <td>2.004787</td>\n",
       "      <td>0.465233</td>\n",
       "      <td>0.183051</td>\n",
       "      <td>0.162961</td>\n",
       "      <td>0.142429</td>\n",
       "      <td>0.077498</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.059130</td>\n",
       "      <td>0.079070</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.022392</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>183.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.337083</td>\n",
       "      <td>0.337842</td>\n",
       "      <td>0.520000</td>\n",
       "      <td>0.134950</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>366.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.498333</td>\n",
       "      <td>0.486733</td>\n",
       "      <td>0.626667</td>\n",
       "      <td>0.180975</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>548.500000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.655417</td>\n",
       "      <td>0.608602</td>\n",
       "      <td>0.730209</td>\n",
       "      <td>0.233214</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>731.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.861667</td>\n",
       "      <td>0.840896</td>\n",
       "      <td>0.972500</td>\n",
       "      <td>0.507463</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          instant     weekday  workingday        temp       atemp         hum  \\\n",
       "count  731.000000  731.000000  731.000000  731.000000  731.000000  731.000000   \n",
       "mean   366.000000    2.997264    0.683995    0.495385    0.474354    0.627894   \n",
       "std    211.165812    2.004787    0.465233    0.183051    0.162961    0.142429   \n",
       "min      1.000000    0.000000    0.000000    0.059130    0.079070    0.000000   \n",
       "25%    183.500000    1.000000    0.000000    0.337083    0.337842    0.520000   \n",
       "50%    366.000000    3.000000    1.000000    0.498333    0.486733    0.626667   \n",
       "75%    548.500000    5.000000    1.000000    0.655417    0.608602    0.730209   \n",
       "max    731.000000    6.000000    1.000000    0.861667    0.840896    0.972500   \n",
       "\n",
       "        windspeed  \n",
       "count  731.000000  \n",
       "mean     0.190486  \n",
       "std      0.077498  \n",
       "min      0.022392  \n",
       "25%      0.134950  \n",
       "50%      0.180975  \n",
       "75%      0.233214  \n",
       "max      0.507463  "
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征工程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数值特征标准化（去量纲化）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "#分别初始化对特征和目标值的标准化器\n",
    "ss_x = MinMaxScaler()\n",
    "ss_y = MinMaxScaler()\n",
    "\n",
    "#分别对训练和测试数据的特征以及目标值进行标准化处理\n",
    "#对训练数据，先调用fit方法训练模型，得到模型参数；然后对训练数据和测试数据进行transform\n",
    "X = ss_x.fit_transform(X)\n",
    "\n",
    "y = ss_y.fit_transform(y.reshape(-1,1))\n",
    "log_y = ss_y.fit_transform(log_y.reshape(-1,1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分割测试集和训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(584, 7)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 随机采样20%的数据构建测试样本，其余作为训练样本\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=3, test_size=0.2)     #random_state 即random_seed\n",
    "X_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性回归（最小二乘）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>atemp</td>\n",
       "      <td>[1.1768157041616427]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>instant</td>\n",
       "      <td>[0.4086055389820882]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>weekday</td>\n",
       "      <td>[0.040282674803133134]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>workingday</td>\n",
       "      <td>[0.01803995094196653]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>[-0.17363828963688677]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>hum</td>\n",
       "      <td>[-0.3158980922591236]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>temp</td>\n",
       "      <td>[-0.5643466241349118]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      columns                    coef\n",
       "4       atemp    [1.1768157041616427]\n",
       "0     instant    [0.4086055389820882]\n",
       "1     weekday  [0.040282674803133134]\n",
       "2  workingday   [0.01803995094196653]\n",
       "6   windspeed  [-0.17363828963688677]\n",
       "5         hum   [-0.3158980922591236]\n",
       "3        temp   [-0.5643466241349118]"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "#使用默认参数\n",
    "lr = LinearRegression()                  #要加括号！！！！\n",
    "\n",
    "#模型训练\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "#预测\n",
    "y_test_pred_lr = lr.predict(X_test)\n",
    "y_train_pred_lr = lr.predict(X_train)\n",
    "\n",
    "#查看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\": list(columns), \"coef\": list(lr.coef_.T)})\n",
    "fs.sort_values(by = [\"coef\"], ascending = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "结果显示体感温度、温度、湿度、风速与租车人数的关联性较大。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型结果评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The RMSE of LinearRegression on test is 0.007725120348887274\n",
      "The RMSE of LinearRegression on train is 0.006266714620495881\n"
     ]
    }
   ],
   "source": [
    "# 使用RMSE评价模型在测试集和训练集上的性能，并输出评估结果\n",
    "from sklearn.metrics import mean_squared_error as mse\n",
    "\n",
    "lr_rmse_test = mse(y_test, y_test_pred_lr) * 0.5\n",
    "lr_rmse_train = mse(y_train, y_train_pred_lr) * 0.5\n",
    "\n",
    "\n",
    "#测试集\n",
    "print ('The RMSE of LinearRegression on test is', lr_rmse_test)\n",
    "#训练集\n",
    "print ('The RMSE of LinearRegression on train is', lr_rmse_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## L2正则+岭回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>atemp</td>\n",
       "      <td>[1.0076474934241215]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>instant</td>\n",
       "      <td>[0.40944715555738753]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>weekday</td>\n",
       "      <td>[0.039909758300680664]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>workingday</td>\n",
       "      <td>[0.018129475195706846]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>[-0.1787416260309982]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>hum</td>\n",
       "      <td>[-0.3134697788330951]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>temp</td>\n",
       "      <td>[-0.4069904384836498]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      columns                    coef\n",
       "4       atemp    [1.0076474934241215]\n",
       "0     instant   [0.40944715555738753]\n",
       "1     weekday  [0.039909758300680664]\n",
       "2  workingday  [0.018129475195706846]\n",
       "6   windspeed   [-0.1787416260309982]\n",
       "5         hum   [-0.3134697788330951]\n",
       "3        temp   [-0.4069904384836498]"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import RidgeCV\n",
    "\n",
    "#设置超参数（调优参数）\n",
    "#alphas = [0.001, 0.01, 0.1, 1, 10]\n",
    "alphas = [0.018779997, 0.018789998, 0.018799999, 0.0188, 0.01880000001]\n",
    "\n",
    "#创建实例\n",
    "ridge = RidgeCV(alphas = alphas)                  #要加括号！！！！\n",
    "\n",
    "#模型训练\n",
    "ridge.fit(X_train, y_train)\n",
    "\n",
    "#预测\n",
    "y_test_pred_ridge = ridge.predict(X_test)\n",
    "y_train_pred_ridge = ridge.predict(X_train)\n",
    "\n",
    "#查看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\": list(columns), \"coef\": list(ridge.coef_.T)})\n",
    "fs.sort_values(by = [\"coef\"], ascending = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.018799999"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ridge.alpha_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型评价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The RMSE of LinearRegression on test is 0.007476905405447194\n",
      "The RMSE of LinearRegression on train is 0.006267993086930962\n"
     ]
    }
   ],
   "source": [
    "# 使用RMSE评价模型在测试集和训练集上的性能，并输出评估结果\n",
    "from sklearn.metrics import mean_squared_error as mse\n",
    "\n",
    "ridge_rmse_test = mse(y_test, y_test_pred_ridge) * 0.5\n",
    "ridge_rmse_train = mse(y_train, y_train_pred_ridge) * 0.5\n",
    "\n",
    "\n",
    "#测试集\n",
    "print ('The RMSE of LinearRegression on test is', ridge_rmse_test)\n",
    "#训练集\n",
    "print ('The RMSE of LinearRegression on train is', ridge_rmse_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## L1正则+Lasso"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:1100: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n",
      "d:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:1978: FutureWarning: The default value of cv will change from 3 to 5 in version 0.22. Specify it explicitly to silence this warning.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>atemp</td>\n",
       "      <td>0.870715</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>instant</td>\n",
       "      <td>0.409954</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>weekday</td>\n",
       "      <td>0.039307</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>workingday</td>\n",
       "      <td>0.018013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>-0.181224</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>temp</td>\n",
       "      <td>-0.279129</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>hum</td>\n",
       "      <td>-0.310158</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      columns      coef\n",
       "4       atemp  0.870715\n",
       "0     instant  0.409954\n",
       "1     weekday  0.039307\n",
       "2  workingday  0.018013\n",
       "6   windspeed -0.181224\n",
       "3        temp -0.279129\n",
       "5         hum -0.310158"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LassoCV\n",
    "\n",
    "\n",
    "#设置超参数（调优参数）\n",
    "#alphas = [0.00001, 0.0001, 0.001, 0.01,0.1, 1]\n",
    "#alphas = [0.0185, 0.0186, 0.0187, 0.0188, 0.0189]\n",
    "\n",
    "#创建实例\n",
    "lasso = LassoCV()                  #要加括号！！！！\n",
    "\n",
    "#模型训练\n",
    "lasso.fit(X_train, y_train)\n",
    "\n",
    "#预测\n",
    "y_test_pred_lasso = lasso.predict(X_test)\n",
    "y_train_pred_lasso = lasso.predict(X_train)\n",
    "\n",
    "#查看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\": list(columns), \"coef\": list(lasso.coef_.T)})\n",
    "fs.sort_values(by = [\"coef\"], ascending = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.178874702085779e-05"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lasso.alpha_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型评价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The RMSE of LinearRegression on test is 0.00703349118734679\n",
      "The RMSE of LinearRegression on train is 0.006279163633857505\n"
     ]
    }
   ],
   "source": [
    "# 使用RMSE评价模型在测试集和训练集上的性能，并输出评估结果\n",
    "from sklearn.metrics import mean_squared_error as mse\n",
    "\n",
    "lasso_rmse_test = mse(y_test, y_test_pred_lasso) * 0.5\n",
    "lasso_rmse_train = mse(y_train, y_train_pred_lasso) * 0.5\n",
    "\n",
    "\n",
    "#测试集\n",
    "print ('The RMSE of LinearRegression on test is', lasso_rmse_test)\n",
    "#训练集\n",
    "print ('The RMSE of LinearRegression on train is', lasso_rmse_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 题目5：不懂"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
